package com.zh.listener;

import com.alibaba.fastjson.JSON;
import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.context.annotation.Configuration;

import java.io.IOException;

@Configuration
public class DirectReceiver {

    @RabbitListener(queues = "test-direct-queue") //监听队列的名称
    public void processDirect(Message message, Channel channel) throws IOException {
        // 采用手动应答模式，手动确认应答更加安全稳定
        System.out.println("direct监听消息===第一个====："+ new String(message.getBody()));
        /**
         * 第二个参数是 是否批量消费,true:将一次性ack所有小于deliveryTag的消息。
         */
        channel.basicAck(message.getMessageProperties().getDeliveryTag(),false); // 确认消费


        /**
         * 设置不消费某条消息
         * //第一个参数依然是当前消息到的数据的唯一id;
         *         //第二个参数是指是否针对多条消息；如果是true，也就是说一次性针对当前通道的消息的tagID小于当前这条消息的，都拒绝确认。
         *         //第三个参数是指是否重新入列，也就是指不确认的消息是否重新丢回到队列里面去
         */
//        channel.basicNack(message.getMessageProperties().getDeliveryTag(),false,true);

        /**
         * 拒绝消费
         * 如果第二参数传入true，就是将数据重新丢回队列里，那么下次还会消费这消息。设置false，
         * 就是告诉服务器，我已经知道这条消息数据了，因为一些原因拒绝它，而且服务器也把这个消息丢掉就行。 下次不想再消费这条消息了
          */
//        channel.basicReject(message.getMessageProperties().getDeliveryTag(),true);

    }

}
